import { defineNuxtPlugin } from '#app';
import axios from 'axios';
import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus'
import errorCode from '@/utils/errorCode'
import {getToken} from "~/utils/auth.js";
import apiConfig from '@/config/api.config'
export let isRelogin = { show: false };
export default defineNuxtPlugin((nuxtApp) => {
    const config = useRuntimeConfig() // 添加运行时配置
    const apiClient = axios.create({
        baseURL: config.public.apiBase || (process.client ? '/dev-api' : apiConfig.BASE),// 替换为你的后端API地址
        timeout: 10000, // 请求超时时间
        headers: {
            'Content-Type': 'application/json',
        },
    });

    // 添加请求拦截器
    apiClient.interceptors.request.use(
        (config) => {
             // 添加服务端请求的特殊处理
             if (process.server) {
                config.headers = {
                    ...config.headers,
                    'x-forwarded-host': process.env.NUXT_PUBLIC_SITE_URL,
                    'x-forwarded-proto': 'https'
                }
            }
            // 在发送请求之前做些什么
            const token = getToken(); // 假设你使用cookie存储token
            if (token) {
                config.headers.Authorization = `Bearer ${token}`;
            }
            return config;
        },
        (error) => {
            console.error('Request error:', error)
            // 对请求错误做些什么
            return Promise.reject(error);
        }
    );

    // 添加响应拦截器
    apiClient.interceptors.response.use(
        (res) => {
            // 未设置状态码则默认成功状态
            const code = res.data.code || 200;
            // 获取错误信息
            const msg = errorCode[code] || res.data.msg || errorCode['default']
            // 二进制数据则直接返回
            if (res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer') {
                return res.data
            }
            if (code === 401) {
                if (!isRelogin.show) {
                    isRelogin.show = true;
                    ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                         confirmButtonText: '重新登录',
                          cancelButtonText: '取消',
                           type: 'warning' 
                        }).then(() => {
                        isRelogin.show = false;
                       /* useUserStore().logOut().then(() => {
                            location.href = '/index';
                        })*/
                    }).catch(() => {
                        isRelogin.show = false;
                    });
                }
                return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
            } else if (code === 500) {
                ElMessage({ message: msg, type: 'error' })
                return Promise.reject(new Error(msg))
            } else if (code === 601) {
                ElMessage({ message: msg, type: 'warning' })
                return Promise.reject(new Error(msg))
            } else if (code !== 200) {
                ElNotification.error({ title: msg })
                return Promise.reject('error')
            } else {
                return  Promise.resolve(res.data)
            }
        },
        (error) => {
             // 错误处理
             if (error.response) {
                const status = error.response.status
                if (status === 401) {
                    console.error('Unauthorized, please login again');
                } else if (status === 500) {
                    console.error('Server Error:', error.response.data);
                }
            }
            return Promise.reject(error);
        }
    );

    // 提供 API 客户端
    return {
        provide: {
            apiClient
        }
    }
});
